moregirlfriend
分析
glibc 2.31版本,开启沙箱禁用了execve,saygoodbye功能是一个其中释放堆的操作,漏洞就在这个函数中
因为for循环编写不当导致越界,且同时to_free_list变量下面接着的是chunk变量,所以可以通过该越界漏洞free(chunk[0])进而构造double free(因为2.31的tcache有double free检测,所以需要构造在fastbin中)
做法1
通过fastbin attach攻击 free_hook,通过setcontext控制寄存器进行ORW,由于自2.29版本后setcontext的参数由rdi变成rdx,所以该方法需要找到一条gadget将rdi赋值给rdx,例如mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20];
。
exp
1 | #coding:utf-8 |
做法2
利用fastbin attack 攻击 stdin,优势在于rdx可以通过_IO_2_1_stdin_->_IO_write_ptr
控制,比较方便
1 | #coding:utf-8 |